package prueba.dao;

import prueba.bean.ArticuloDTO;
import prueba.constans.PgQuerys;
import prueba.constans.RowMapperConstants;


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository					
public class AlmacenDAO {
	
	private SimpleJdbcTemplate simpleJdbcTemplate;
    private JdbcTemplate jdbcTemplate;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	
	@Autowired
	public void init(DataSource dataSource) {
		this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
		this.jdbcTemplate=new JdbcTemplate(dataSource);
		this.namedParameterJdbcTemplate=new NamedParameterJdbcTemplate(dataSource);
	}
	
	
	//Mostrar
	public int insertar(ArticuloDTO articulo){
		String sql = PgQuerys.INSERTAR_ALMACEN;
		Map<String, Object>parametros = new HashMap<String, Object>();
		parametros.put("cod_articulo",articulo.getCod_articulo());
		parametros.put("nom_articulo",articulo.getNom_articulo());
		parametros.put("cant_articulo",articulo.getCant_articulo());
		
		return this.simpleJdbcTemplate.update(sql,parametros);
		
		
	}
	//Listar
	@SuppressWarnings("unchecked")	
	public List<ArticuloDTO> listar(ArticuloDTO articulo,int paginaMostrar,int cantidadFilas){
		String sql=PgQuerys.LISTAR_ALMACEN;
		StringBuffer sqlb = new StringBuffer();
		
		if(articulo.getId_articulo()!=0){
			sqlb.append(" and id_articulo = "+articulo.getId_articulo()+" ");
		}
		if(articulo.getCod_articulo()!=null){  
			sqlb.append(" and cod_articulo like'%"+articulo.getCod_articulo()+"%' ");
		}
		if(articulo.getNom_articulo()!=null){
			sqlb.append(" and nom_articulo like'%"+articulo.getNom_articulo()+"%' ");
		}
		if(articulo.getCant_articulo()!=0){
			sqlb.append(" and cant_articulo = "+articulo.getCant_articulo()+" ");
		}
		sqlb.append(" order by id_articulo ");
		
		sql+=sqlb.toString();
		//System.out.println(sql);
		
		int inicio = (paginaMostrar-1)*cantidadFilas;
		sql+=" LIMIT "+cantidadFilas+" OFFSET "+inicio;
		
		return this.jdbcTemplate.query(sql,new RowMapperConstants.AlmacenMapper());
		
	}
	
	//Modificar
	public int modificar(ArticuloDTO articulo){
		Map<String,Object> parametros= new HashMap<String, Object>();
		parametros.put("id_articulo", articulo.getId_articulo());
		parametros.put("cod_articulo",articulo.getCod_articulo());
		parametros.put("nom_articulo",articulo.getNom_articulo());
		parametros.put("cant_articulo",articulo.getCant_articulo());
		String sql = PgQuerys.MODIFICAR_ALMACEN;
		
		return this.simpleJdbcTemplate.update(sql,parametros);
		
	}
	
	//Eliminar
	public int eliminar(ArticuloDTO articulo){
		System.out.println("id:"+articulo.getId_articulo());
		String sql = PgQuerys.ELIMINAR_ALMACEN;
		Map<String,Object> parametros = new HashMap<String,Object>();
		parametros.put("id_articulo",articulo.getId_articulo());
		return this.simpleJdbcTemplate.update(sql,parametros);	
		
	}
	
	
	@SuppressWarnings("unchecked")
	public List<ArticuloDTO> obtenerID(ArticuloDTO articulo){
		String sql = PgQuerys.OBTENER_POR_ID;
		if(articulo.getId_articulo()!=0){
			sql+=" and id_articulo = "+articulo.getId_articulo()+" ";
		}
		return this.jdbcTemplate.query(sql,new RowMapperConstants.AlmacenMapper());
	
	}
	
	//paginacion
	//numero de paginas
	public int numeroPaginas(ArticuloDTO articulo, int cantidadFilas){
		StringBuffer sqlb = new StringBuffer();

		if(articulo.getCod_articulo()!=null){
			sqlb.append(" and cod_articulo LIKE '%"+articulo.getCod_articulo()+"%'");
		}
		if(articulo.getNom_articulo()!=null){
			sqlb.append(" and nom_articulo LIKE '%"+articulo.getNom_articulo()+"%'");
		}
		if(articulo.getCant_articulo()!=0){
			sqlb.append(" and cant_articulo = "+articulo.getCant_articulo()+" ");
		}
	//obtener cantidad de registro
		StringBuffer sqlbcantidadRegistro = new StringBuffer(PgQuerys.CANTIDAD_REGISTROS_ALMACEN);
		sqlbcantidadRegistro.append(sqlb.toString());
		String cantidadRegistro = sqlbcantidadRegistro.toString();
	//ontengo la cantidad de registro
		int cantidad=this.simpleJdbcTemplate.queryForInt(cantidadRegistro);
		int numeroDePaginas;
		
		numeroDePaginas = cantidad/cantidadFilas;
		if(cantidad%cantidadFilas>0)numeroDePaginas++;
		return numeroDePaginas;
	}
	
}
